#pragma once
#include <string>
#include <unordered_map>

namespace RPC
{
    // 后面在json中key值的宏。
#define KEY_METHOD "method"
#define KEY_PARAMETER "parameters"
#define KEY_TOPIC_KEY "key"
#define KEY_TOPIC_MSG "msg"
#define KEY_OPTYPE "optype"
#define KEY_HOST "host"
#define KEY_HOST_IP "host_ip"
#define KEY_HOST_PORT "host_port"
#define KEY_RCODE "rcode"
#define KEY_RESULT "result"

    enum class MType // 消息类型设计
    {
        REQ_RPC = 0,
        RES_RPC,
        REQ_TOPIC,
        RES_TOPIC,
        REQ_SERVICE,
        RES_SERVICE
    };

    static std::string mType(MType type)
    {
        switch(type)
        {
            case MType::REQ_RPC: return "REQ_RPC";
            case MType::RES_RPC: return "RES_RPC";
            case MType::REQ_TOPIC: return "REQ_TOPIC";
            case MType::RES_TOPIC: return "RES_TOPIC";
            case MType::REQ_SERVICE: return "REQ_SERVICE";
            case MType::RES_SERVICE: return "RES_SERVICE";
        }
        return "UNKONW MTYPE";
    }

    enum class RCode // 响应状态码
    {
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,           // 消息解析失败
        RCODE_FIELD_MISS,             // 消息无效
        RCODE_CONNECTED_DISCONNECTED, // 连接断开
        RCODE_INVALID_PARA_RPC,       // 无效的调用参数
        RCODE_NOT_FOUND_RPC,          // RPC服务不存在
        RCODE_NOT_FOUND_SERVICE,      // 服务不存在
        RCODE_INVALID_TOPIC_OPE,      // 无效Topic操作类型
        RCODE_NOT_TOPIC,              // 主题无效
        RCODE_INVAILD_SERVICE_OPE,     // 无效服务操作类型
        RCODE_INTERNAL_RPC             //内部错误
    };

    static std::string errReason(RCode err)
    {
        std::unordered_map<RCode, std::string> err_map =
            {
                {RCode::RCODE_OK, "成功处理"},
                {RCode::RCODE_PARSE_FAILED, "解析失败"},
                {RCode::RCODE_FIELD_MISS, "消息中字段缺失"},
                {RCode::RCODE_CONNECTED_DISCONNECTED, "连接断开"},
                {RCode::RCODE_INVALID_PARA_RPC, "无效的调用参数"},
                {RCode::RCODE_NOT_FOUND_RPC, "RPC服务不存在"},
                {RCode::RCODE_INVALID_TOPIC_OPE, "无效的Topic操作类型"},
                {RCode::RCODE_NOT_FOUND_SERVICE, "服务不存在"},
                {RCode::RCODE_NOT_TOPIC, "主题不存在"},
                {RCode::RCODE_INVAILD_SERVICE_OPE, "无效的服务操作类型"},
                {RCode::RCODE_INTERNAL_RPC, "内部错误"}};
        auto it = err_map.find(err);
        if (it != err_map.end())
        {
            return it->second;
        }
        else
        {
            return "错误的返回码";
        }
    }

    enum class RpcType // Rpc请求方式
    {
        RPC_SYN,
        RPC_ASYN,
        RPC_CALLBACK
    };

    enum class TopicOpType // 主题操作
    {
        TOPIC_CREAT = 0, // 主题创建
        TOPIC_DELETE,    // 主题删除
        TOPIC_SUB,       // 主题订阅
        TOPIC_UNSUB,     // 主题取消订阅
        TOPIC_PUBLISH    // 主题发布
    };

    enum class ServiceOpType
    {
        SERVICE_REGISTER = 0, // 服务注册
        SERVICE_DISCOVERY,    // 服务发现
        SERVICE_ONLINE,       // 服务上线
        SERVICE_OFFLINE,      // 服务下线
        SERVICE_UNKNOW        // 未知服务
    };
}